class Solution {
public:
    int getMaxLen(vector<int>& nums) {
        int n = nums.size();
        vector<int> f(n), g(n);
        // 以i结尾的所有子数组中，乘积为正/负数的最长子数组的长度。
        int ret = INT_MIN;
        if(nums[0] < 0)
            g[0] = 1, ret = 0;
        else if(nums[0] > 0)
            f[0] = 1, ret = 1;
        for(int i = 1; i < n; ++i)
        {
            if(nums[i] < 0)
            {
                g[i] = f[i-1] + 1;
                f[i] = g[i-1] == 0 ? 0 : g[i-1] + 1;
            }
            else if(nums[i] > 0)
            {
                f[i] = f[i-1] + 1;
                g[i] = g[i-1] == 0 ? 0 : g[i-1] + 1;
            }
            ret = max(ret, f[i]);
        }
        return ret;
    }
};